package com.kodcu.service.convert.docbook; import com.kodcu.config.EditorConfigBean; import com.kodcu.controller.ApplicationController; import com.kodcu.other.Current; import com.kodcu.other.IOHelper; import com.kodcu.service.ui.IndikatorService; import com.kodcu.service.ui.TabService; import javafx.application.Platform; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.xml.sax.SAXParseException; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; import java.io.ByteArrayInputStream; import java.nio.charset.Charset; import java.nio.file.Path; /** * Created by usta on 21.06.2015. */ @Component public class DocbookValidator { private final ApplicationController controller; private final TabService tabService; private final Current current; private final IndikatorService indikatorService; private final EditorConfigBean editorConfigBean; private Logger logger = LoggerFactory.getLogger(DocbookValidator.class); @Autowired public DocbookValidator(ApplicationController controller, TabService tabService, Current current, IndikatorService indikatorService, EditorConfigBean editorConfigBean) { this.controller = controller; this.tabService = tabService; this.current = current; this.indikatorService = indikatorService; this.editorConfigBean = editorConfigBean; } public boolean validateDocbook(String rendered) { final boolean validateDocbook = editorConfigBean.getValidateDocbook(); if (!validateDocbook) { return true; } try { SchemaFactory schemaFactory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); Path xsdPath = controller.getConfigPath().resolve("docbook-config/xsd/docbook.xsd"); Schema sch = schemaFactory.newSchema(new StreamSource(xsdPath.toFile())); Validator validator = sch.newValidator(); validator.validate(new StreamSource(new ByteArrayInputStream(rendered.getBytes(Charset.forName("UTF-8"))))); logger.debug("Docbook successfully validated"); return true; } catch (Exception e) { if (e instanceof SAXParseException) { SAXParseException pe = (SAXParseException) e; int columnNumber = pe.getColumnNumber(); int lineNumber = pe.getLineNumber(); Path currentDir = current.currentPath().map(Path::getParent).get(); Path xmlPath = IOHelper.createTempFile(currentDir, ".xml"); IOHelper.writeToFile(xmlPath, rendered); Platform.runLater(() -> { tabService.addTab(xmlPath, () -> { current.currentEditor().call("addAnnotation", (lineNumber - 1), columnNumber, pe.getMessage(), "error"); }); }); logger.error("Please fix Docbook validation error. LineNumber: {}, Column: {}", lineNumber, columnNumber, pe); } else { logger.error("Problem occured while validating Docbook content", e); } indikatorService.stopProgressBar(); return false; } } }